标签
spring
工具
字数
734 字
阅读时间
4 分钟
验证工具类
java
import com.commnetsoft.commons.utils.StringUtils;
import java.util.*;
/**
* 验证工具类
* @author sunwen
* @since 2019/7/18
*/
public class ValidHelper {
private static Map<String, Constraint> constraints = new HashMap<>();
static {
register(new NotEmpty());
register(new Length());
register(new Range());
register(new Unique());
}
/**
* 注册约束,注册成功返回true
* @author sunwen
* @since 2019/7/18
*/
public static boolean register(Constraint constraint){
if(constraint != null){
String name = constraint.name();
if(!constraints.containsKey(name)){
constraints.put(name, constraint);
return true;
}
}
return true;
}
/**
* 解析验证器
* @author sunwen
* @since 2019/7/18
*/
public static Validator parse(String expression) throws Exception{
String name = null;
String args = null;
if (expression.contains("(")){
String[] split = expression.split("(?=\\()");
if (split.length == 2) {
name = split[0].trim();
args = split[1].trim();
String removeStart = StringUtils.removeStart(args, "(");
args = StringUtils.removeEnd(removeStart, ")");
}
}else{
name = expression;
}
Constraint c = constraints.get(name);
if(c != null){
//TODO 相同参数可以优化从缓存中读取
return c.create(args);
}
throw new Exception("约束未定义");
}
public static List<Validator> batchParse(String expression) throws Exception{
if (StringUtils.isEmpty(expression)) {
return null;
}
expression = StringUtils.removeStart(expression, " ");
expression = StringUtils.removeEnd(expression, " ");
String[] split = expression.split(" +(?=[^\\)]+(\\(|$))|(?<=\\))");
List<Validator> validatorList = new ArrayList<>();
for(String exp : split){
validatorList.add(parse(exp));
}
return validatorList;
}
}接口
java
/**
* 约束接口,用于创建约束验证器,生成约束表达式
* @author sunwen
* @since 2019/7/18
*/
public interface Constraint<T extends Validator> {
/**
* 约束名称
* @author sunwen
* @since 2019/7/18
*/
String name();
/**
* 中文名
* @author wuzm
* @since 2020/1/3
*/
String chName();
/**
* 根据字符串参数创建约束验证器,
* @param args 字符串参数,多个参数一般约定已“,”分隔
* @author sunwen
* @since 2019/7/18
*/
T create(String args) throws Exception;
/**
* 根据多个参数创建约束验证器
* @author sunwen
* @since 2019/7/18
*/
T create(Object... args) throws Exception;
/**
* 根据验证器创建表达式
* @author sunwen
* @since 2019/7/18
*/
String express(T validator);
}java
import com.commnetsoft.commons.Result;
import java.util.Map;
/**
* 验证器接口
* @author sunwen
* @since 2019/7/18
*/
public interface Validator {
/**
* 验证数据
* @param value 验证的数据
* @param context 验证上下文数据
* @author sunwen
* @since 2019/7/18
*/
Result<Void> validate(Object value, Map<String, Object> context);
}实现
java
/**
* 数据唯一验证
* @author sunwen
* @since 2019/7/26
*/
public class Unique implements Constraint<Validator> {
@Override
public String name() {
return "unique";
}
@Override
public String chName() {
return "唯一性";
}
@Override
public Validator create(String args) throws Exception {
return UniqueValidator.load();
}
@Override
public Validator create(Object... args) throws Exception {
return UniqueValidator.load();
}
@Override
public String express(Validator validator) {
return name();
}
}java
import com.commnetsoft.core.CoreConstant;
import com.commnetsoft.core.utils.ClassScaner;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* 唯一性验证,自动加载项目中的实现类
* @author sunwen
* @since 2020/7/9
*/
public abstract class UniqueValidator implements Validator {
private static UniqueValidator validator;
private static final AtomicBoolean loaded = new AtomicBoolean();
public static UniqueValidator load() throws Exception{
if(!loaded.get()){
synchronized (loaded){
List<Class<? extends UniqueValidator>> list = ClassScaner.scan(CoreConstant.Package.BASE, UniqueValidator.class);
if(list.size() > 0){
validator = list.get(0).newInstance();
}
loaded.set(true);
}
}
if(validator == null){
throw new Exception("unique约束找不到Validator实现类");
}
return validator;
}
}验证错误
java
import com.alibaba.fastjson.annotation.JSONType;
import com.commnetsoft.core.IErrorConstant;
import com.commnetsoft.ConstantEnum;
@JSONType(serializeEnumAsJavaBean = true)
@ConstantEnum(value = "验证错误码", namespace = "error", fixed = true)
public enum ValidateError implements IErrorConstant {
type_error("数据类型不正确"),
not_empty("值不能为空"),
out_of_range("值超出范围"),
length_limit("长度不在范围内"),
unique_limit("值已存在"),
;
private String msg;
ValidateError(){}
ValidateError(String msg){
this.msg = msg;
}
@Override
public void setMessage(String message) {
this.msg = message;
}
@Override
public String getMessage() {
return msg;
}
}